/* Luis Alfonso Aguirre 12024
 * Pablo Duque 12145
 * Hoja de Trabajo 9
 */
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.*;
/**
 *
 * @author LuisAlfonso
 */
public class GrafosyFloyd {

    public static void main(String[] args){
        
        //Inicializando variables
        AlgorFloyd matriz = new AlgorFloyd(); 
        matriz.caminoCorto(); 
        int seleccion=0; 
        int opcion;
        String ciudad1, ciudad2;
        Scanner scan = new Scanner(System.in);
        
        //Ciclo del menu
        while(seleccion!=4){
             //Menu del programa
            System.out.println("Menu principal\n");
            System.out.println("1. Ruta mas corta entre ciudades");
            System.out.println("2. Mostrar el centro del grafo");
            System.out.println("3. Modificar grafo");
            System.out.println("4. Fin del programa\n");
            System.out.println("Ingrese una opcion: ");
            seleccion = scan.nextInt(); 
            
            System.out.println("\nMatriz de adyacencia\n");
            matriz.D.show();
            
            switch(seleccion){
                case 1: //Ruta mas corta entre ciudades
                    matriz.caminoCorto();
                    System.out.println("Ingrese el nombre de la ciudad de salida");
                    ciudad1 = scan.next(); 
                    System.out.println("Ingrese el nombre de la ciudad de destino");
                    ciudad2 = scan.next();
                    if(matriz.D.contains(ciudad1)&&matriz.D.contains(ciudad2)){
                        System.out.println("\nLa distancia minima es: "+matriz.D.getEdge(ciudad1, ciudad2)+".");
                        if(matriz.D.getEdge(ciudad1, ciudad2)!=10000){
                            System.out.print("La ruta es: "+ciudad1);
                            matriz.mostrarIntermedias(matriz.D.getIndex(ciudad1), matriz.D.getIndex(ciudad2));
                            System.out.println(", "+ciudad2);
                        }
                    }
                    break;
                
                case 2: //Centro del grafo
                    matriz.centroGrafo();
                    break;
                    
                case 3: //Modificacion del grafo
                    //Menu secundario
                    System.out.println("\nMenu secundario");
                    System.out.println("1. Interrupcion entre ciudades");
                    System.out.println("2. Nueva conexion entre ciudades");
                    System.out.println("\n Seleccione una opcion");
                    opcion = scan.nextInt();
                    
                    switch(opcion){
                        
                        case 1: //Interrupcion entre ciudades
                            System.out.println("Ingrese el nombre de la ciudad de salida");
                            ciudad1 = scan.next();
                            System.out.println("Ingrese el nombre de la ciudad de destino");
                            ciudad2 = scan.next();
                            if(matriz.D.contains(ciudad1)&&matriz.D.contains(ciudad2)){
                                matriz.D.addEdge(ciudad1, ciudad2, 10000);
                                try {
                                    matriz.a.write(ciudad1+" "+ciudad2+" 10000");
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }
                            matriz.caminoCorto();
                            break;
                        
                        case 2: //Nueva conexion de ciudades
                            System.out.println("Ingrese el nombre de la ciudad de salida");
                            ciudad1 = scan.next();
                            System.out.println("Ingrese el nombre de la ciudad de destino");
                            ciudad2 = scan.next();
                            System.out.println("Ingrese la distancia entre las ciudades");
                            int distancia = scan.nextInt();
                            // Si las ciudades ya existen, cambiar el valor
                            if(matriz.D.contains(ciudad1)&&matriz.D.contains(ciudad2)){
                                matriz.D.addEdge(ciudad1, ciudad2, distancia);
                            }
                            // Si las ciudades no existen, agregarlas a la matriz
                            else{
                                matriz.D.add(ciudad1);
                                matriz.D.add(ciudad2);
                                matriz.D.addEdge(ciudad1, ciudad2, distancia);
                            }
                            // Guarda los cambios en el archivo
                            try {
                                matriz.a.write(ciudad1+" "+ciudad2+" "+distancia);
                            }catch (IOException ex) {
                                ex.printStackTrace();
                            }
                            matriz.caminoCorto();
                            break;
                            
                        default:
                            System.out.println("Ha seleccionado una opcion invalida");    
                            break;
                    }
                    break;
                    
                case 4: //Salida del programa
                    System.out.println("Ha salido del programa");
                    break;
                    
                default: //Opcion invalida
                    System.out.println("Ha seleccionado una opcion invalida.");   
                    break;
            }               
        }        
    }
}
